from PIL import Image


def laplacian_edge_detection(image_path, output_path):
    """
    使用拉普拉斯算子对输入图像进行边缘检测。

    参数:
    image_path (str): 输入图像的文件路径。
    output_path (str): 输出边缘检测后图像的文件路径。
    """
    # 打开原始图像并转换为灰度图（以灰度图为例）
    image = Image.open(image_path).convert('L')
    # 获取图像的宽度和高度
    width, height = image.size
    # 创建新的空白图像，尺寸与原图像相同，模式也相同，用于存储边缘检测结果
    new_image = Image.new('L', (width, height))
    # 定义拉普拉斯算子（常用的一种简单形式）
    laplacian_kernel = [[0, 1, 0],
                        [1, -4, 1],
                        [0, 1, 0]]
    # 遍历图像的每个像素点（避开边缘部分，边缘可后续单独处理或者忽略）
    for y in range(1, height - 1):
        for x in range(1, width - 1):
            # 用于累计经过拉普拉斯算子处理后的像素值
            sum_value = 0
            # 遍历拉普拉斯算子范围内的像素点
            for ky in range(3):
                for kx in range(3):
                    pixel = image.getpixel((x + kx - 1, y + ky - 1))
                    sum_value += pixel * laplacian_kernel[ky][kx]
            # 对处理后的像素值进行处理,乘以5是为了让边缘显示更加直观
            edge_value = abs(sum_value) * 5
            # 将边缘检测值归一化到0-255范围（方便显示和保存为图像）
            normalized_value = int(edge_value / (4 * 255) * 255)
            # 将归一化后的边缘检测值设置到新图像对应的坐标位置
            new_image.putpixel((x, y), normalized_value)
    # 保存边缘检测后的图像
    new_image.save(output_path)
    return new_image

image_path = "D:/cangku/computer-image-project-design/test3.png"
output_path = "D:/cangku/computer-image-project-design/test5.png"
laplacian_edge_detection(image_path, output_path)